package com.sinux.generality.basesupport.utils.exception;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;

/**
 * @className BusinessValidateException
 * @describe 异常
 * @author panxw
 * @date 2020年4月17日 下午5:24:47
 * @remark
 */
@Getter
@Setter
public class BusinessValidateException extends RuntimeException {

    private static final long serialVersionUID = -2333726144918456070L;

    /**
     * 返回给终端的code
     **/
    private int errorCode;

    /**
     * 返回给终端的msg
     **/
    private String errorMsg;

    /**
     * 返回给客户端的数据
     **/
    private Object data;

    private static final String SPEC = ":";

    /**
     * 创建一个新的实例 BusinessValidateException
     */
    public BusinessValidateException() {
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param errorCode 返回给终端的errorCode
     * @param errorMsg  返回给终端的errorMsg
     */
    public BusinessValidateException(int errorCode, String errorMsg) {
        super(errorMsg);
        setErrorCode(errorCode);
        setErrorMsg(errorMsg);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param errorCode 返回给终端的errorCode
     * @param errorMsg  返回给终端的errorMsg
     * @param cause     原始异常
     */
    public BusinessValidateException(int errorCode, String errorMsg, Throwable cause) {
        super(errorMsg, cause);
        setErrorCode(errorCode);
        setErrorMsg(errorMsg);
    }

    /*** 创建一个新的实例 BusinessValidateException
     * @param errorCode 返回给终端的errorCode
     * @param errorMsg  返回给终端的errorMsg
     * @param data      返回给终端的data
     */
    public BusinessValidateException(int errorCode, String errorMsg, Object data) {
        super(errorMsg.concat(SPEC).concat(JSON.toJSONString(data)));
        setErrorCode(errorCode);
        setErrorMsg(errorMsg);
        setData(data);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     *
     * @param errorCode 返回给终端的errorCode
     * @param errorMsg  返回给终端的errorMsg
     * @param data      返回给终端的data
     * @param cause     原始异常
     */
    public BusinessValidateException(int errorCode, String errorMsg, Object data, Throwable cause) {
        super(errorMsg.concat(SPEC).concat(JSON.toJSONString(data)), cause);
        setErrorCode(errorCode);
        setErrorMsg(errorMsg);
        setData(data);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     *
     * @param returnEnum 返回给终端的errorCode 和 errorMsg
     */
    public BusinessValidateException(ReturnEnum returnEnum) {
        super(returnEnum.getMsg());
        setReturnCodeTypeEnum(returnEnum);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode 和 errorMsg
     * @param logMsg     日志打印的 message
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg) {
        super(logMsg);
        setReturnCodeTypeEnum(returnEnum);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode 和 errorMsg
     * @param logMsg     日志打印的 message
     * @param cause      原始异常
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg, Throwable cause) {
        super(logMsg, cause);
        setReturnCodeTypeEnum(returnEnum);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode
     * @param logMsg     日志打印的 logMsg
     * @param errorMsg   返回给终端的errorMsg
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg, String errorMsg) {
        super(logMsg);
        setReturnCodeTypeEnum(returnEnum);
        setErrorMsg(errorMsg);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode
     * @param logMsg     日志打印的 logMsg
     * @param errorMsg   返回给终端的errorMsg
     * @param cause      原始异常
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg, String errorMsg, Throwable cause) {
        super(logMsg, cause);
        setReturnCodeTypeEnum(returnEnum);
        setErrorMsg(errorMsg);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode 和 errorMsg
     * @param logMsg     日志打印的 logMsg
     * @param data       返回给终端的data
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg, Object data) {
        super(logMsg);
        setReturnCodeTypeEnum(returnEnum);
        setData(data);
    }

    /**
     * 创建一个新的实例 BusinessValidateException
     * @param returnEnum 返回给终端的errorCode 和 errorMsg
     * @param logMsg     日志打印的 logMsg
     * @param data       返回给终端的data
     * @param cause      原始异常
     */
    public BusinessValidateException(ReturnEnum returnEnum, String logMsg, Object data, Throwable cause) {
        super(logMsg, cause);
        setReturnCodeTypeEnum(returnEnum);
        setData(data);
    }

    /**
     * setReturnCodeTypeEnum 根据枚举,初始化返回给终端的errorCode 和 errorMsg
     * @param returnEnum 枚举
     */
    public void setReturnCodeTypeEnum(ReturnEnum returnEnum) {
        this.errorCode = returnEnum.getCode();
        this.errorMsg = returnEnum.getMsg();
    }

}
